home *** CD-ROM | disk | FTP | other *** search
/ The Games Machine 76 / XENIATGM66.iso / Indiana Jones / Indiana Jones.exe / RESOURCE / PREVIEW.GOB / cog_sea_deck_ai.cog < prev    next >
Text File  |  1999-11-15  |  15KB  |  447 lines

  1. # Jones 3D Cog Script
  2. #
  3. # SEA_Deck_AI.cog
  4. # Management of the Sailor patrol patterns and population on the surface deck of the Pudovkin
  5. #
  6. #
  7. # [JM]
  8. #
  9. # (C) 1999 LucasArts Entertainment Company LLC. All Rights Reserved
  10. #
  11. # ========================================================================================
  12. # ========================================================================================
  13. Symbols
  14.  
  15. message         startup
  16. message         entered
  17. message         killed
  18. message         timer
  19. #message         taken
  20. message         user0          
  21. message         user1
  22. message         user2
  23. message         user3
  24.  
  25. #=================================== SUBROUTINES ========================================
  26. flex            NewSailor               local
  27. flex            RandomSailorPicker      local
  28. flex            GhostPicker             local
  29. flex            InstinctManager         local
  30. flex            SailorCacheCheck        local
  31. flex            DisableAIForCutscene    local
  32. flex            EnableAIAfterCutscene   local
  33.  
  34. #========== SAILORS ON DECK.  ALSO USED FOR CREATION OF REPLACEMENT SAILORS==============
  35.  
  36. thing           DeckSailor00     LinkID=1
  37. thing           DeckSailor01     LinkID=1
  38. thing           DeckSailor02     LinkID=1
  39. thing           DeckSailor03     LinkID=1  #One sailor Standing Guard at the start, i.e. not roaming
  40.  
  41. #============== GHOST OBJECTS FOR THE CREATION OF NEW SAILORS============================
  42. thing           GhostSailor00    
  43. thing           GhostSailor01    
  44. thing           GhostSailor02    
  45.  
  46. #======================= ADJOIN TRIGGERS =============================
  47.  
  48. surface         Begin           #Start the maddness
  49.  
  50. #surface         BridgeCutsceneOn    mask=0x404
  51. #surface         BridgeCutsceneOff   #mask=0x404
  52.  
  53. #thing           CrankWheel
  54. #thing           DingyWinch
  55.  
  56. #=========================== MISC LOCAL VARIABLES =======================================
  57.  
  58. int             counter                     local
  59. int             counter2                    local
  60. int             StartCheck=0                local
  61. int             SailorGrowthCounter=0       local
  62.  
  63. int             IndyNearestwpnt             local
  64. int             GhostSailorNum              local
  65.  
  66.     # Random number variables for making new commies
  67. int             SailorRand                  local
  68. int             SailorRandCheck=-1          local
  69. int             VoiceRand                   local
  70. int             VoiceRandCheck=-1           local
  71.  
  72. int             UpperGridOn=-1              local
  73.  
  74. int             NumSailorsInCache=0         local
  75.  
  76. int             IndyHasTheCrank=0           local
  77.  
  78. int             CutsceneStatus=0            local
  79.  
  80. thing           TempSailor                  local
  81.  
  82. # ================================= CONSTANTS ===========================================
  83.                 
  84. int             SAILOR_MAKER_CAP=6              local
  85. int             STARTING_SAILORS=4              local
  86. int             VARIETY_OF_COMMIES=3            local
  87. int             VARIETY_OF_VOICES=5             local
  88. int             TIMER_ID_CREATE_SAILOR          local
  89.  
  90. int             FLEE_TO_WPNT=0                  local
  91.  
  92. flex            NEW_SAILOR_DELAY=32.0                   local
  93. flex            MIN_COMMIE_CREATION_SEPARATION=20.0    local
  94. flex            PrevCommieCreationTime                local
  95.  
  96. # ============================ COMMIE TEMPLATES =========================================
  97.                                 
  98. template        TokarevTPL00=Sailor_Tokarev     local
  99. template        TokarevTPL01=Sailor_Tokarev2    local
  100. template        TokarevTPL02=Sailor_Tokarev3    local
  101. template        TokarevTPL03=Sailor_Tokarev4    local
  102. template        TokarevTPL04=Sailor_Tokarev5    local
  103.  
  104. template        SimonovTPL00=Sailor_Simonov     local
  105. template        SimonovTPL01=Sailor_Simonov2    local
  106. template        SimonovTPL02=Sailor_Simonov3    local
  107. template        SimonovTPL03=Sailor_Simonov4    local
  108. template        SimonovTPL04=Sailor_Simonov5    local
  109.  
  110. template        MauserTPL00=Sailor_Mauser       local
  111. template        MauserTPL01=Sailor_Mauser2      local
  112. template        MauserTPL02=Sailor_Mauser3      local
  113. template        MauserTPL03=Sailor_Mauser4      local
  114. template        MauserTPL04=Sailor_Mauser5      local
  115.  
  116.  
  117. end
  118.  
  119. # ========================================================================================
  120. # ========================================= CODE =========================================
  121. # ========================================================================================
  122.  
  123. code
  124.  
  125. # ========================================================================================
  126. startup:
  127.  
  128.     for(counter = 0; counter < STARTING_SAILORS; counter = counter + 1)
  129.     {   
  130.         AISetCutsceneMode(DeckSailor00[counter]);  #  Start all of the sailors in cutscene mode.  Their patrols trigger when Idny gets on deck
  131.         SetThingFlags(DeckSailor00[counter], 0x80000);
  132.     }
  133.     
  134.     
  135.     return;
  136.     
  137. # ========================================================================================
  138. entered:
  139.     
  140.     if(GetSenderRef() == Begin) #Do this once, only once, and nothing else until then
  141.     {
  142.         if(StartCheck != 0) return;
  143.         
  144.         StartCheck = 1;
  145.  
  146.         for(counter = 0; counter < STARTING_SAILORS; counter = counter + 1)
  147.         {
  148.             ClearThingFlags(DeckSailor00[counter], 0x80000);   
  149.             AIClearCutsceneMode(DeckSailor00[counter]);
  150.         
  151.             AISetInstinctWpntMode(DeckSailor00[counter]);
  152.         
  153.             if(counter < 2) // Only set two of the Commies roaming at the start
  154.             {
  155.                 AIEnableInstinct(DeckSailor00[counter], "roam", 1);
  156.             }
  157.         }
  158.     }
  159.     
  160. //    else if(GetSenderRef() == BridgeCutsceneOn && CutsceneStatus == 0)
  161. //    {
  162. //        DebugPrint("DisablingAI for cutscene");
  163. //        CutsceneStatus = 1;  //Cutscene is in the process of playing
  164. //        Call DisableAIForCutscene;
  165. //    }
  166.     
  167. //    else if(GetSenderRef() == BridgeCutsceneOff && CutsceneStatus == 1)
  168. //    {
  169. //        DebugPrint("EnablingAI after Cutscene");
  170.         
  171. //        Call EnableAIAfterCutscene;
  172. //        CutsceneStatus = 2;  //Cutscene has played and won't play again
  173. //        Call SailorCacheCheck;
  174. //    }                                                                  
  175.     
  176.     return;
  177.  
  178. # ========================================================================================
  179. killed:
  180.  
  181.     TempSailor = GetSenderRef();
  182.     for (counter = 0; counter < STARTING_SAILORS; counter = counter + 1)
  183.     {
  184.         if (DeckSailor00[counter] == TempSailor) #locate exactly which sailor died and prepare to make a new one
  185.         {            
  186.             DeckSailor00[counter] = -1;
  187.         }
  188.     }
  189.     
  190.     SetTimerEx(NEW_SAILOR_DELAY, TIMER_ID_CREATE_SAILOR, 0, 0);  #Small delay before making a new sailor      
  191.     
  192.     return;
  193.     
  194. # ========================================================================================
  195. timer:
  196.     
  197.     if(GetSenderID() == TIMER_ID_CREATE_SAILOR) #From the SetTimerEx in the killed message
  198.     {
  199.         Call NewSailor;
  200.     }    
  201.                        
  202.     return;
  203.  
  204. # ========================================================================================
  205. //taken:
  206.  
  207. //    if(IndyHasTheCrank == 1) return;
  208.     
  209. //    if(GetSenderRef() == CrankWheel)
  210. //    {
  211. //        IndyHasTheCrank = 1;
  212. //    }
  213.     
  214. //    return;
  215.  
  216. # ========================================================================================
  217. //Expects SEA_Grid.cog to send a message when it swaps out grids... only param(0) is being used for now
  218. User0:
  219.  
  220.     UpperGridOn = GetParam(0);
  221.     
  222.     if(StartCheck == 0) return; // Nothing will happen until the initial entered message above is recieved
  223.     Call InstinctManager;
  224.     Call SailorCacheCheck; //See if any Sailors were added to the cache while the Uper Grid was off
  225.  
  226.     return;
  227.     
  228. # ========================================================================================
  229. user1:
  230.     
  231.     Sleep(1.0);
  232.     
  233.     for(counter = 0; counter < STARTING_SAILORS; counter = counter + 1)
  234.     {
  235.         //Make the commies run away so that when Indy solves the final puzzle they aren't just standing on camera doing nothing
  236.         if(DeckSailor00[counter] != -1)
  237.         {
  238.             SetThingFlags(DeckSailor00[counter], 0x80000); //Fleeing didn't work so well, just disabling them
  239.             
  240.         //AISetSubMode(DeckSailor00[counter], 0x8000); // SITHAI_SUBMODECONTINUOUSWPNTMOTION. Required for FleeToWpnt
  241.         //AIFleeToWpnt(Decksailor00[counter], FLEE_TO_WPNT);               
  242.         }
  243.     }
  244.     
  245.     return;
  246.  
  247. # ========================================================================
  248. user2:
  249.  
  250.     Call DisableAIForCutscene;
  251.  
  252.     return;
  253.     
  254. # ========================================================================
  255. user3:
  256.  
  257.     Call EnableAIAfterCutscene;
  258.  
  259.     return;    
  260.             
  261. # ========================================================================
  262. #                           -==SUBROUTINES==-
  263. # ========================================================================
  264. //  Expects a dead sailor with its value set to -1
  265. //  Creates a new random sailor to replace any killed on the deck
  266. //  Ghost Objects will be checked for LOS to the player
  267. NewSailor:
  268.     
  269.     if(SailorGrowthCounter >= SAILOR_MAKER_CAP) #Check to see if any more sailors are allowed to be made
  270.     {
  271.         return;
  272.     }
  273.     
  274.     if(UpperGridOn == 0 || CutsceneStatus == 1)
  275.     {
  276.         NumSailorsInCache = NumSailorsInCache + 1;
  277.         return;
  278.     }    
  279.     
  280.     if(GetFlexGameTime() - PrevCommieCreationTime < MIN_COMMIE_CREATION_SEPARATION)
  281.     {
  282.         SetTimerEx(MIN_COMMIE_CREATION_SEPARATION, TIMER_ID_CREATE_SAILOR, 0, 0); 
  283.         return;
  284.     }
  285.     
  286.     for(counter = 0; counter < (STARTING_SAILORS  - 1); counter = counter + 1)  #Only keep Regenerating three of the Sailors, Hence the -1.
  287.     {
  288.         if(DeckSailor00[counter] == -1)
  289.         {
  290.             Call GhostPicker;
  291.             Call RandomSailorPicker;
  292.             
  293.             if(SailorRand == 0)
  294.             {
  295.                 DeckSailor00[counter] = CreateThing(TokarevTPL00[VoiceRand], GhostSailor00[GhostSailorNum]);
  296.             }
  297.             else if(SailorRand == 1)
  298.             {
  299.                 DeckSailor00[counter] = CreateThing(SimonovTPL00[VoiceRand], GhostSailor00[GhostSailorNum]);
  300.             }
  301.             else
  302.             {
  303.                 DeckSailor00[counter] = CreateThing(MauserTPL00[VoiceRand], GhostSailor00[GhostSailorNum]);
  304.             }
  305.             
  306.             if (DeckSailor00[counter] == -1)
  307.             {
  308.                 SetTimerEx(10.0, TIMER_ID_CREATE_SAILOR, 0, 0);  
  309.             return;
  310.             }
  311.             
  312.             SailorGrowthCounter = SailorGrowthCounter + 1;
  313.             
  314.             PrevCommieCreationTime = GetFlexGameTime();
  315.             
  316.             CaptureThing(DeckSailor00[counter]);
  317.             
  318.             AISetInstinctWpntMode(DeckSailor00[counter]);
  319.             
  320.             AIEnableInstinct(DeckSailor00[counter], "roam", 1);
  321.             
  322.             if(RandBetween(0, 2) < 2)
  323.             {
  324.                 AIWpntHuntTarget(DeckSailor00[counter], 1.6, 0.0);
  325.             }
  326.             
  327.             return;
  328.         }
  329.     }
  330.     return;
  331.    
  332. # ========================================================================================
  333. //Finds one of a set number of Ghost Objects for creating a new Sailor
  334. //If Indy is near a defined group of waypoints new commie wil always be created at a specific ghost object
  335. GhostPicker:    
  336.     
  337.     IndyNearestWpnt = AIFindNearestWpnt(GetLocalPlayerThing()); #finds nearest waypoint to the player
  338.     
  339.     if(IndyNearestwpnt <= 7)
  340.     {
  341.         GhostSailorNum = 1;
  342.     }
  343.     else if(IndyNearestWpnt <= 15)
  344.     {
  345.         GhostSailorNum = 2;
  346.     }
  347.     else if(IndyNearestWpnt <= 25 )
  348.     {
  349.         GhostSailorNum = 0;
  350.     }
  351.     
  352.     return;
  353.     
  354. # ========================================================================================
  355. // Picks a Commie from bank of templates and then picks one of the 5 vocal interations of that commie
  356. // makes sure that new sailor is not the same type or voice as any previously generated sailor
  357. RandomSailorPicker:
  358.     
  359.     SailorRand = RandBetween(0, VARIETY_OF_COMMIES-1);  #Randomly choose from one of three templates
  360.     while(SailorRand == SailorRandCheck)
  361.     {
  362.         SailorRand = RandBetween(0, VARIETY_OF_COMMIES-1);
  363.     }    
  364.     SailorRandCheck = SailorRand;
  365.     
  366.     VoiceRand = RandBetween(0, VARIETY_OF_VOICES-1);    #Randomly choose one of the 5 voice iterations of the sailors
  367.     while(VoiceRand == VoiceRandCheck)
  368.     {
  369.         VoiceRand = RandBetween(0, VARIETY_OF_VOICES-1);
  370.     }
  371.     VoiceRandCheck = VoiceRand;
  372.  
  373.     return;
  374.  
  375. # ========================================================================================
  376. //Expects UpperGridOn to be defined by the User0 message.
  377. //Sets cutscene mode on and off when the Deck Grid is turned on and off by SEA_Grid.cog
  378. InstinctManager:
  379.     
  380.     if(UpperGridOn == 0)
  381.     {
  382.         for(counter = 0; counter < STARTING_SAILORS; counter = counter +1)
  383.         {   
  384.             if(DeckSailor00[counter] != -1)
  385.             {
  386.                 AIClearInstinctWpntMode(DeckSailor00[counter]);
  387.                 AISetCutsceneMode(DeckSailor00[counter]);
  388.             }
  389.         }
  390.     }
  391.     else
  392.     {
  393.         for(counter = 0; counter < STARTING_SAILORS; counter = counter + 1)
  394.         {
  395.             if(DeckSailor00[counter] != -1)
  396.             {
  397.                 AIClearCutsceneMode(DeckSailor00[counter]);
  398.                 AISetInstinctWpntMode(DeckSailor00[counter]);
  399.             }
  400.         }
  401.     }
  402.             
  403.     return;
  404.  
  405. # ========================================================================================
  406. //Checks to see if there are any Sailors that had to be put in the Cache because the Upper Grid was off
  407. //Then Makes that many new Sailors
  408. SailorCacheCheck:
  409.     
  410.     if(NumSailorsInCache == 0) return;
  411.     
  412.     while(NumSailorsInCache != 0)
  413.     {
  414.         NumSailorsInCache = NumSailorsInCache - 1;
  415.         Call NewSailor;
  416.     }
  417.     return;
  418.  
  419. # ========================================================================================
  420. DisableAIForCutscene:
  421.  
  422.     for(counter = 0; counter < STARTING_SAILORS; counter = counter + 1)
  423.     {
  424.         if(DeckSailor00[counter] != -1) 
  425.         {
  426.             AISetCutsceneMode(DeckSailor00[counter]);
  427.         }
  428.     }                                                 
  429.     
  430.     return;
  431. # ========================================================================================
  432. EnableAIAfterCutscene:
  433.  
  434.     for(counter = 0; counter < STARTING_SAILORS; counter = counter + 1)
  435.     {
  436.         if(DeckSailor00[counter] != -1)
  437.         {
  438.             AIClearCutsceneMode(DeckSailor00[counter]);
  439.         }
  440.     }
  441.  
  442.     return;
  443.  
  444. # ========================================================================================
  445. end
  446.